package com.book.backend.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.book.backend.common.BasePage;
import com.book.backend.common.R;
import com.book.backend.mapper.NoticeMapper;
import com.book.backend.pojo.Notice;
import com.book.backend.service.NoticeService;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * @description 针对表【t_notice】的数据库操作Service实现
 * @createDate 2023-02-05 16:14:03
 */
@Service
public class NoticeServiceImpl extends ServiceImpl<NoticeMapper, Notice>
        implements NoticeService {
    /**
     * 查询公告列表，并按照创建日期升序排序。
     *
     * @return R<List<Notice>> 包含公告列表的响应对象。如果列表为空，响应状态码为404，消息为"获取公告信息失败"；
     *         如果列表不为空，响应状态码为200，消息为"获取公告信息成功"。
     */
    @Override
    public R<List<Notice>> getNoticeList() {

        // 创建条件构造器，按照公告的创建日期进行升序排序
        LambdaQueryWrapper<Notice> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByAsc(Notice::getCreateTime);

        // 根据条件查询公告列表
        List<Notice> list = this.list(queryWrapper);

        // 创建响应对象
        R<List<Notice>> result = new R<>();

        // 判断公告列表是否为空，为空则设置相应的状态码和消息
        if (list.isEmpty()) {
            result.setStatus(404);
            result.setMsg("获取公告信息失败");
            return result;
        }

        // 公告列表不为空，设置成功状态码和消息，并将列表数据设置到响应对象中
        result.setData(list);
        result.setStatus(200);
        result.setMsg("获取公告信息成功");
        return result;
    }

    /**
     * 1.查询出公告列表(创建时间升序)
     * 2.判断是否为空
     * 3.为空，返回错误信息,不为空返回成功新
     */
    @Override
    public R<Page<Notice>> getNoticeList(BasePage basePage) {

        // 根据传入的页码和页大小设置分页信息
        int pageNum = basePage.getPageNum();
        int pageSize = basePage.getPageSize();
        Page<Notice> pageInfo = new Page<>(pageNum, pageSize);
        R<Page<Notice>> result = new R<>();

        // 构造查询条件，按创建时间升序排序
        LambdaQueryWrapper<Notice> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.orderByAsc(Notice::getCreateTime);

        // 执行分页查询
        Page<Notice> page = this.page(pageInfo, queryWrapper);

        // 如果查询结果为空，返回错误信息
        if (page.getTotal() == 0) {
            return R.error("公告列表为空");
        }

        // 设置成功响应状态和信息，并返回查询结果
        result.setStatus(200);
        result.setMsg("获取公告列表成功");
        result.setData(pageInfo);
        return result;
    }

    /**
     * 1.接受公告标题和公告内容(检查是否为空的情况),图书管理员id
     * 2.如果都不为空，调用服务新增公告，返回响应状态码和请求信息
     */
    @Override
    public R<String> addNotice(Notice notice) {

        // 检查公告标题和内容是否为空
        String noticeTitle = notice.getNoticeTitle();
        String noticeContent = notice.getNoticeContent();
        if (StringUtils.isBlank(noticeTitle) || StringUtils.isBlank(noticeContent)) {
            return R.error("新增公告失败，存在空值");
        }

        // 创建新的公告实例并设置属性
        Notice notice1 = new Notice();
        notice1.setNoticeId(null); // 设置公告ID为null，通常由数据库自动生成
        notice1.setNoticeTitle(noticeTitle); // 设置公告标题
        notice1.setNoticeContent(noticeContent); // 设置公告内容
        notice1.setNoticeAdminId(notice.getNoticeAdminId()); // 设置公告管理员ID

        // 保存公告到数据库
        boolean save = this.save(notice1);
        if (!save) {
            return R.error("新增公告失败");
        }

        // 公告保存成功，返回成功信息
        return R.success(null, "新增公告成功");
    }

    @Override
    public R<String> deleteNoticeById(Integer noticeId) {
        // 尝试根据公告ID删除公告
        boolean remove = this.removeById(noticeId);
        if (!remove) {
            // 如果删除失败，返回错误信息
            return R.error("删除公告失败");
        }
        // 如果删除成功，返回成功信息
        return R.success(null, "删除公告成功");
    }

    /**
     * 根据公告ID获取公告信息。
     *
     * @param noticeId 公告的唯一标识符。
     * @return 返回一个包含公告信息的响应对象。如果公告不存在，则返回错误信息。
     */
    @Override
    public R<Notice> getNoticeByNoticeId(Integer noticeId) {
        // 通过公告ID获取公告对象
        Notice notice = this.getById(noticeId);
        if (notice == null) {
            // 如果公告不存在，返回错误信息
            return R.error("获取公告失败");
        }
        // 创建响应对象，并设置成功状态及消息
        R<Notice> result = new R<>();
        result.setStatus(200);
        result.setMsg("获取公告信息成功");
        // 设置返回的公告数据
        result.setData(notice);
        return result;
    }

    /**
     * 根据公告ID更新公告信息.
     *
     * @param noticeId 公告ID，用于指定要修改的公告。
     * @param notice 包含公告新内容的Notice对象。
     * @return 返回操作结果，成功则返回成功消息，失败则返回错误消息。
     */
    @Override
    public R<String> updateNoticeByNoticeId(Integer noticeId, Notice notice) {
        // 提取公告标题和内容
        String noticeTitle = notice.getNoticeTitle();
        String noticeContent = notice.getNoticeContent();
        // 检查标题和内容是否为空
        if (StringUtils.isBlank(noticeTitle) || StringUtils.isBlank(noticeContent)) {
            return R.error("修改公告失败");
        }
        // 根据ID查询公告，确认公告存在
        Notice notice2 = this.getById(noticeId);
        if (notice2 == null) {
            return R.error("修改公告失败");
        }
        // 更新公告标题和内容
        notice2.setNoticeTitle(noticeTitle);
        notice2.setNoticeContent(noticeContent);
        // 保存修改后的公告
        boolean update = this.updateById(notice2);
        if (!update) {
            return R.error("修改公告失败");
        }

        // 修改成功，返回成功消息
        return R.success(null, "修改公告成功");
    }
}




